#ifndef BASESTRING_H
#define BASESTRING_H
#include <qchar.h>
#include <QDebug>

/* Class BaseString */
class BaseString
{
public:

    /*
     * @brief 构造函数，用于测试基本字符类型
     */
    BaseString()
    {
        //介绍QChar
        {
            QChar ch1{}; // 默认构造函数，创建一个空字符
            QChar ch2{'A'}; // 单字节初始化构造函数，自动转化为Unicode
            QChar ch3{0x0041}; // 使用十六进制Unicode码点初始化
            QChar ch4{65}; // 使用整数Unicode码点初始化
            QChar ch5{ch3}; // 拷贝构造函数

            qDebug() << ch1 << ch2 << ch3; // 输出: 'A' 'A' 'A'
            qDebug() << sizeof(QChar)
                        << ch1.unicode() << ch2.unicode() << ch3.unicode(); // 输出: 2 65 65 65
            qDebug() << ch1.isDigit() // 检查是否为数字
                     << ch1.isLetter(); // 检查是否为字母
            qDebug() << ch2.isUpper()
                     << ch2.isLower(); // 检查是否为大写或小写字母

            qDebug() << ch3.toLower() ; // 转化为小写
            qDebug() << ch4.toLatin1() ; // 转化为拉丁

        }
        // 介绍QString
        {
            QString str1{}; // 默认构造函数，创建一个空字符串
            QString str2{"Hello"} ; // 使用C风格的字符串初始化
            QString str3{"你好"}; // 使用UTF-8编码的C风格字符串初始化,会自动识别并将其转为Unicode

            // qDebug() << str1 << str2 << str3; // 输出: "" "Hello" "你好"
            qDebug() << "内容为：" << str1 << "大小为： "<< str1.size() ;
            qDebug() << "内容为：" << str2 << "大小为： "<< str2.size() ;
            qDebug() << "内容为：" << str3 << "大小为： "<< str3.size() ;

            QString str4{str3}; // 拷贝构造函数 ， 采用隐式共享
            // 用重载的操作符[]访问字符,会触发写时复制
            // qDebug() << QString("str3首地址") << &str3[0] << QString("str4首地址") << &str4[0]; // 输出: 地址相同，说明str3和str4共享同一内存
            auto pStr3 = str3.constData(); // 获取字符串的只读数据指针
            auto pStr4 = str4.constData(); // 获取字符串的只读数据指
            qDebug() << QString("str3首地址") << pStr3 << QString("str4首地址") << pStr4; // 输出: 地址相同，说明str3和str4共享同一内存

            str4 = "Hello World"; // 修改str4的内容，str3不受影响 ，写时复制
            qDebug() << QString("str3首地址") << &str3[0] << QString("str4首地址") << &str4[0]; // 输出: 地址不同，说明str4已经复制了内容到新的内存

            QString str5{std::move(str2)}; // 移动构造函数，str2 变为空字符串
            QString str6 = "你好";
            QString str7 = QString::fromUtf8("你好"); // 从 UTF-8 编码构造 ，这个与上一个几乎没有区别
            QString str8 = QString::number(123);  // 从数字构造

            qDebug() << "str5的内容为:" << str5 << "\tstr2的内容为:" << str2; // str2已经被移动到str5，str2变为空字符串
            qDebug() << str6.size() << str6.length() ; // 两者输出的是相同的东西只是接口名不同

            // 介绍api接口
            {
                auto str9{str7};
                qDebug() << "是否分离" << str9.isDetached(); // 检测是否分离,没有写入操作即没有分离

                str9 = str7 + "世界" ; // 字符串拼接
                qDebug() << "是否分离" << str9.isDetached(); // 已经分离
                str9.append("世界我不好"); // 向后添加字符串
                str9.prepend("Aiye"); // 向前添加字符串，开辟新的内存然后搬移
                qDebug() << str9 ;

                auto ch1 = str9.front(); // 相当于at(0)
                auto ch2 = str9.back();  // 获取最后一个字符
                auto str1 = str9.left(2); // 提取左边两个字符
                auto str2 = str9.right(2); // 提取右边两个字符
                auto str3 = str9.first(2); // 同上
                auto str4 = str9.last(2); // 同上

                // 方法有很多，需要用到的时候查帮助文档即可。
            }
        }
    }
};
#endif //BASESTRING_H
